const path = require('path');
const { createLogger } = require('./logger');

// 创建日志记录器
const logger = createLogger('path-helper');

/**
 * 获取项目根目录
 */
function getProjectRoot() {
  return path.resolve(__dirname, '../../..');
}

/**
 * 获取应用目录路径
 * @param {string} appName 应用名称
 * @returns {string} 应用目录路径
 */
function getAppPath(appName) {
  return path.join(getProjectRoot(), 'apps', appName);
}

/**
 * 获取应用构建输出目录路径
 * @param {string} appName 应用名称
 * @param {object} buildConfig 构建配置
 * @returns {string} 构建输出目录路径
 */
function getAppDistPath(appName, buildConfig = {}) {
  const appPath = getAppPath(appName);
  const outputDir = buildConfig.apps?.[appName]?.outputDir || 'dist';
  return path.join(appPath, outputDir);
}

/**
 * 构建部署路径（函数化，解耦JSON配置）
 * 支持生产版本和灰度版本路径构建
 * @param {string} basePath 基础路径
 * @param {string} appName 应用名称
 * @param {string} deployType 部署类型：'prod' 或 'gray'，默认 'prod'
 * @param {string} version 版本号（仅灰度部署需要）
 * @returns {string} 最终部署路径
 */
function buildDeployPath(basePath, appName, deployType = 'prod', version = null) {
  // 根据灰度发布方案：
  // 生产版本：{basePath}/{appName}/
  // 灰度版本：{basePath}/{appName}/{version}/
  
  let processedPath = basePath;
  
  // 处理 {app} 占位符
  if (processedPath.includes('{app}')) {
    processedPath = processedPath.replace(/\{app\}/g, appName);
  } else {
    // 确保路径以斜杠结尾
    processedPath = processedPath.endsWith('/') ? processedPath : `${processedPath}/`;
    // 如果路径不包含应用名，则添加应用名
    if (!processedPath.endsWith(`${appName}/`)) {
      processedPath = `${processedPath}${appName}/`;
    }
  }
  
  // 灰度版本：添加版本号路径
  if (deployType === 'gray') {
    if (!version) {
      throw new Error('灰度部署必须提供版本号');
    }
    // 灰度版本路径：{basePath}/{appName}/{version}/
    processedPath = `${processedPath}${version}/`;
  }
  
  // 确保路径以斜杠结尾
  if (!processedPath.endsWith('/')) {
    processedPath += '/';
  }
  
  // 使用正斜杠，避免 Windows 路径问题
  processedPath = processedPath.replace(/\\/g, '/');
  
  return processedPath;
}

/**
 * 处理路径中的应用名占位符（保持向后兼容）
 * @param {string} pathTemplate 路径模板
 * @param {string} appName 应用名称
 * @param {boolean} useReplacement 是否替换占位符
 * @param {string} deployType 部署类型：'prod' 或 'gray'，默认 'prod'
 * @param {string} version 版本号（仅灰度部署需要）
 * @returns {object} 处理后的路径信息
 */
function processAppPath(pathTemplate, appName, useReplacement = true, deployType = 'prod', version = null) {
  const processedPath = buildDeployPath(pathTemplate, appName, deployType, version);
  
  return {
    path: processedPath,
    original: pathTemplate,
    appName,
    hasPlaceholder: pathTemplate.includes('{app}'),
    usedReplacement: useReplacement,
    deployType,
    version
  };
}

/**
 * 生成公共路径URL
 * @param {string} deployPath 部署路径
 * @returns {string} 公共路径URL
 */
function generatePublicPath(deployPath) {
  // 去掉 www/ 前缀，因为这通常是存储桶内的路径，而不是 URL 路径
  return `/${deployPath.replace(/^www[\\/]/, '')}`;
}

/**
 * 规范化路径，确保使用正斜杠并以斜杠结尾
 * @param {string} inputPath 输入路径
 * @returns {string} 规范化的路径
 */
function normalizePath(inputPath) {
  if (!inputPath) return '/';
  
  // 使用正斜杠，避免 Windows 路径问题
  let normalized = inputPath.replace(/\\/g, '/');
  
  // 确保路径以斜杠结尾
  if (!normalized.endsWith('/')) {
    normalized += '/';
  }
  
  return normalized;
}

module.exports = {
  getProjectRoot,
  getAppPath,
  getAppDistPath,
  processAppPath,
  buildDeployPath,
  generatePublicPath,
  normalizePath
}; 